package org.example.three;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import com.rabbitmq.client.Delivery;
import org.example.utils.RabbitMqUtil;
import org.example.utils.SleepUtil;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

public class Work4 {
    public static final String QUEUE_NAME = "ack_queue";

    public static void main(String[] args) throws IOException, TimeoutException {
        Channel channel = RabbitMqUtil.getChannel();
        System.out.println("W2等待消息处理,处理时间较长");
        /**
         * 消费者消费消息
         * 1.消费哪个队列
         * 2.消费成功之后是否自动应答,false:手动应答,true:自动应答
         * 3.消费者成功消费的回调
         * 4.消费者取消消费的回调
         * 5.消息中断的回调
         */
        DeliverCallback deliverCallback = (String message, Delivery delivery) -> {
            SleepUtil.sleep(30);
            System.out.println(new String(delivery.getBody(), StandardCharsets.UTF_8));
            /**
             * 1.消息的标记 tag
             * 2.是否批量应答 false,不批量应答信道中的消息 true:批量
             */
            channel.basicAck(delivery.getEnvelope().getDeliveryTag(),false);
        };
        // 手动应答
        boolean autoAck = false;
        // 设置不公平分发,默认是公平分发,一人一条消息,Qos:服务质量,Quality of Service.
        // 2表示这个消费者一次最多处理2条消息,多的不要,就让其他消费者取处理,所以这是不公平的分发
        channel.basicQos(3);
        channel.basicConsume(QUEUE_NAME,autoAck,deliverCallback,(message)->{
            System.out.println("消息取消了: " + message);
        });
    }
}
